
package com.shai.wool.common.tags;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

/**
 * 分页展示
 *
 * @author 朱国军
 * @since 1.0
 * @version 2016年3月28日 朱国军
 */
public final class PaginationTag extends TagSupport {
    
    private static Logger logger = Logger.getLogger(PaginationTag.class);
    
    private static final long serialVersionUID = -7177581356703711990L;

    /** 当前页码 */
    private Integer pageNo;

    /** 总页数 */
    private Integer pageCount;
    
    /** 查询列表数据的js方法 */
    private String queryFunction;

    /** 分页标签显示位置或样式 */
    private String style;
    
    /**
     * 获取当前页码
     *
     * @return 当前页码
     */
    public Integer getPageNo() {
        return pageNo;
    }
    
    /**
     * 设置当前页码
     *
     * @param pageNo 当前页码
     */
    public void setPageNo(Integer pageNo) {
        this.pageNo = pageNo;
    }
    
    /**
     * 获取总页数
     *
     * @return 总页数
     */
    public Integer getPageCount() {
        return pageCount;
    }
    
    /**
     * 设置总页数
     *
     * @param pageCount 总页数
     */
    public void setPageCount(Integer pageCount) {
        this.pageCount = pageCount;
    }
    
    /**
     * 获取查询列表数据的js方法
     *
     * @return 查询列表数据的js方法
     */
    public String getQueryFunction() {
        return queryFunction;
    }
    
    /**
     * 获取分页标签显示位置或样式
     *
     * @return 分页标签显示位置或样式
     */
    public String getStyle() {
        return style;
    }
    
    /**
     * 设置 分页标签显示位置或样式
     *
     * @param style 分页标签显示位置或样式
     */
    public void setStyle(String style) {
        this.style = style;
    }
    
    /**
     * 设置查询列表数据的js方法
     *
     * @param queryFunction 查询列表数据的js方法
     */
    public void setQueryFunction(String queryFunction) {
        this.queryFunction = queryFunction;
    }
    
    @Override
    public int doEndTag() throws JspException {
        return PaginationTag.EVAL_PAGE;
    }
    
    @Override
    public int doStartTag() throws JspException {
        StringBuilder builder = new StringBuilder();

        if (StringUtils.isBlank(style)) {
            style = "text-center";
        }

        builder.append("<div class='").append(style).append("'>");
        builder.append("<nav>");
        builder.append("<ul class='pagination'>");
        // 上一页按钮
        if (pageNo > 1) {
            builder.append("<li><a href='javascript:").append(queryFunction).append("(").append(pageNo - 1).append(")' >上一页</a></li>");
        }

        if (pageCount > 7 && pageNo > 5) {
            builder.append("<li><a href='javascript:").append(queryFunction).append("(1)'>1</a></li>");
            builder.append("<li><a href='javascript:void(0)'>...</a></li>");
            for (int i = pageNo - 2; i < pageNo; i++) {
                builder.append("<li><a href='javascript:").append(queryFunction).append("(").append(i).append(")'>").append(i).append("</a></li>");
            }
        } else {
            for (int i = 1; i < pageNo; i++) {
                builder.append("<li><a href='javascript:").append(queryFunction).append("(").append(i).append(")'>").append(i).append("</a></li>");
            }
            
        }

        // 当前页
        builder.append("<li><a href='javascript:void(0);'>").append(pageNo).append("</a></li>");

        if (pageCount > 7 && (pageCount - pageNo) > 4) {
            for (int i = pageNo + 1; i < pageNo + 3; i++) {
                builder.append("<li><a href='javascript:").append(queryFunction).append("(").append(i).append(")'>").append(i).append("</a></li>");
            }
            builder.append("<li><a href='javascript:void(0)'>...</a></li>");
            builder.append("<li><a href='javascript:").append(queryFunction).append("(").append(pageCount).append(")'>").append(pageCount)
                .append("</a></li>");

        } else {
            for (int i = pageNo + 1; i < pageCount + 1; i++) {
                builder.append("<li><a href='javascript:").append(queryFunction).append("(").append(i).append(")'>").append(i).append("</a></li>");
            }
        }

        // 下一页按钮
        if (pageNo.intValue() != pageCount.intValue()) {
            builder.append("<li><a href='javascript:").append(queryFunction).append("(").append(pageNo + 1).append(")' >下一页</a></li>");
        }

        builder.append("</ul></nav></div>");

        JspWriter writer = this.pageContext.getOut();
        try {
            writer.write(builder.toString().trim());
        } catch (IOException e) {
            logger.error("字典项转radio的Tag出错", e);
        }
        return PaginationTag.SKIP_BODY;

    }

}
